package com.cskaoyan.javase.object._6clone._2copy;
/**
 * 浅克隆以及深克隆
 * 浅克隆指的是: 对象当中的基本数据类型属性,可以一份独立的成员变量;
 * 但是对象中的引用数据类型,克隆的是引用
 * 克隆后的引用和原先的引用仍然指向同一个对象
 * 那么这时原先的对象和克隆对象,不是完全独立的
 * 这就是浅克隆,浅克隆得到的对象,有可能互相影响
 * Object类的克隆默认实现就是浅克隆的
 *
 * 深克隆:
 *      深克隆得到的两个对象是完全独立的
 *          不会出现引用成员变量指向同一个对象互相影响的情况.
 *
 *  怎么做深度克隆呢?
 *          1.深度克隆是在浅克隆的基础上完成的
 *          2.克隆一份对象中引用指向的对象
 *          3.让克隆引用,指向克隆对象
 *
 *
 * @since 17:18
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher t = new Teacher(28, 10000, new A(100));
        Teacher cloneTeacher = t.clone();
        t.age = 38;
        System.out.println(cloneTeacher.age);
        t.a.num = 200;
        System.out.println(cloneTeacher.a.num);
    }
}
class Teacher implements Cloneable{
    int age;
    double salary;
    A a;

    public Teacher(int age, double salary, A a) {
        this.age = age;
        this.salary = salary;
        this.a = a;
    }

    @Override
    public Teacher clone() throws CloneNotSupportedException {
        // 1.深度克隆是在浅克隆的基础上完成的
        Teacher cloneTeacher = (Teacher) super.clone();
        // 2.克隆一份对象中引用指向的对象
        // 克隆一份A的对象,这时需要对类A做一系列操作
        A cloneA = a.clone();
        // 3.让克隆引用,指向克隆对象
        cloneTeacher.a = cloneA;
        // 以上完成深度克隆
        return cloneTeacher;
    }
}
class A implements Cloneable{
    int num;

    public A(int num) {
        this.num = num;
    }

    @Override
    protected A clone() throws CloneNotSupportedException {
        return (A) super.clone();
    }
}